「AppStream 2.0」でSAML 2.0を使ったIDフェデレーションを設定する (Google Cloud Identity編)
みなさん、こんにちは!
福岡オフィスの青柳です。
Amazon AppStream 2.0では、アプリケーション利用者のユーザー認証方式として以下を用意しています。
- AppStream 2.0ユーザープール (AppStream 2.0内に閉じたユーザー管理)
- SAML 2.0を使った外部IDプロバイダーへのフェデレーション (いわゆるシングルサインオン(SSO))
今回は、後者のうち、Googleが提供するIDプロバイダーである「Google Cloud Identity」とのIDフェデレーションを試してみました。
~~~
なお、「Azure Active Directory (Azure AD)」を使ったAppStream 2.0のIDフェデレーションについてもブログ記事にしていますので、併せてご覧ください。
また、Oktaを使う方法のブログ記事もありますので、Oktaを利用される方はこちらを参照してください。
参考にした情報
AppStream 2.0におけるSAML 2.0を使ったIDフェデレーションの汎用的な手順については、AWSドキュメントの下記ページを参照しました。
また、Google Cloud Identityに関する設定手順については、AWSブログを参考にしました。
- Setting up G Suite SAML 2.0 federation with Amazon AppStream 2.0 | Desktop and Application Streaming
AWSブログの内容は一部画面などが古い箇所があるため、最新 (2021年7月現在) の手順は本ブログ記事を参考にしてください。
事前準備
IDフェデレーションの設定に入る前に、事前に以下の準備をしておきます。
- AppStream 2.0でアプリケーションが利用できる状態にする
- Google Cloud Identityが利用できる状態にする
- Google Cloud Identityでユーザーを作成する
AppStream 2.0でアプリケーションが利用できる状態にする
Amazon AppStream 2.0: 入門ガイド に従って、AppStream 2.0でアプリケーションが利用できるように設定します。
下記のブログ記事に手順の解説や補足事項がありますので、併せて参照するとよいと思います。
Google Cloud Identityが利用できる状態にする
Google Cloud Identityは、無償版の「Free Edition」、有償版の「Premium Edition」のいずれであっても、SAML 2.0によるIDフェデレーション機能が利用できます。 また、Google Workspace (旧称:G Suite) でも同様にIDフェデレーションが利用できます。
Google Cloud Identity Free Editionを利用開始する手順は下記ブログ記事を参考にしてください。
Google Cloud Identityでユーザーを作成する
具体的な手順は省略しますが、Google Cloud Identityの管理コンソールから「ディレクトリ」→「ユーザー」→「新しいユーザーの追加」でユーザーを作成しておきます。
やってみた
以下の流れで設定して行きます。
- [Google Cloud Identity] カスタムSAMLアプリケーションを作成する
- [AWS] IAMコンソールでIDプロバイダの設定を行う
- [AWS] IDフェデレーション用のIAMロールを作成する
- [Google Cloud Identity] ユーザープロフィール定義にカスタム属性を追加する
- [Google Cloud Identity] SAMLアプリケーションにSAML属性マッピングを設定する
- [Google Cloud Identity] 対象ユーザーにカスタム属性を設定する
- [Google Cloud Identity] SAMLアプリケーションをユーザーに割り当てる
- 対象ユーザーでGoogleにログインして、AppStream 2.0アプリケーションを利用する
ステップ1: [Google Cloud Identity] カスタムSAMLアプリケーションを作成する
Google Cloud Identityの管理コンソールで、サイドメニューから「アプリ」→「ウェブアプリとモバイルアプリ」を開きます。
上部のメニューから「アプリを追加」→「カスタムSAMLアプリの追加」の順に選択します。
「1 アプリの詳細」画面で情報を入力します。
項目 | 設定値 |
---|---|
アプリ名 | SAML for AWS AppStream |
アプリのアイコン | 任意の画像を指定 (本手順では省略します) |
「2 Google IDプロバイダの詳細」画面で「メタデータをダウンロード」ボタンをクリックします。
ファイル「GoogleIDPMetadata.xml」をローカルディスクに保存します。
「3 サービスプロバイダの詳細」画面で情報を入力します。
項目 | 設定値 |
---|---|
ACSのURL | https://signin.aws.amazon.com/saml |
エンティティID | urn:amazon:webservices |
開始URL | AppStream 2.0スタックの「リレーステートURL」を入力 (欄外参照) |
署名付き応答 | チェックしない |
名前IDの形式 | 「PERSISTENT」を選択 |
名前ID | 「Basic Information > Primary email」を選択 |
「リレーステートURL」は以下のように指定します。
<リレーステートエンドポイント>?stack=<スタック名>&accountId=<AWSアカウントID>
「リレーステートエンドポイント」はリージョン毎に用意されています。
該当するリージョンのリレーステートエンドポイントは下記リンク先で確認してください。
SAML のセットアップ - フェデレーションのリレーステートを設定する
例えば、AppStream 2.0のリージョンが「東京」、スタック名が「DemoStack」、AWSアカウントIDが「123456789012」である場合、リレーステートURLは以下のようになります。
https://appstream2.ap-northeast-1.aws.amazon.com/saml?stack=DemoStack&accountId=123456789012
「4 属性のマッピング」はここでは設定しません。 「完了」をクリックします。
SAMLアプリケーションが作成されたことを確認します。
ステップ2: [AWS] IAMコンソールでIDプロバイダの設定を行う
AWSマネジメントコンソールで、「IAM」→「IDプロバイダ」を開き、「プロバイダの追加」をクリックします。
以下の通り情報を入力します。
項目 | 設定値 |
---|---|
プロバイダのタイプ | 「SAML」を選択 |
プロバイダ名 | GoogleCloud-IdP |
入力後、「メタデータドキュメント」の「ファイルを選択」をクリックして、ステップ1でダウンロードしたGoogle Cloud Identityのメタデータファイル (GoogleIDPMetadata.xml) を指定します。
ファイルのアップロードに成功し、以下のように緑色のチェックマークが表示されることを確認します。
確認後、「プロバイダを追加」をクリックします。
IDプロバイダが追加されたことを確認します。
ステップ3: [AWS] IDフェデレーション用のIAMロールを作成する
AWSマネジメントコンソールで、「IAM」→「ロール」を開き、「ロールを作成」をクリックします。
以下の通り情報を入力します。
項目 | 設定値 |
---|---|
信頼されたエンティティの種類を選択 | 「SAML 2.0フェデレーション」を選択 |
SAMLプロバイダー | 前ステップで作成したプロバイダ「GoogleCloud-IdP」を選択 |
アクセスの種類 | 「プログラムによるアクセスのみを許可する」「プログラムによるアクセスと AWS マネジメントコンソールによるアクセスを許可する」のいずれも選択しないでください (選択してしまった場合は、一旦キャンセルしてやり直してください) |
属性 | 「SAML:sub_type」を選択 |
値 | 「persistent」と入力 |
条件 | 設定しない |
アクセス権限ポリシーは何もアタッチせず、次へ進みます。
必要に応じてタグを追加します。
ロール名およびロールの説明 (任意) を入力します。
項目 | 設定値 |
---|---|
ロール名 | AppStream_GoogleCloud-IdP |
ロールの説明 | 必要に応じて設定 |
「ロールの作成」をクリックして、ロールの作成を完了します。
作成したロールの「信頼関係」タブを開き、「信頼されたエンティティ」と「条件」が下図の通りに設定されていることを確認します。
「アクセス権限」タブを選択し、「インラインポリシーの追加」をクリックします。
以下のようにポリシードキュメントを入力します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appstream:Stream", "Resource": "arn:aws:appstream:ap-northeast-1:123456789012:stack/DemoStack", "Condition": { "StringEquals": { "appstream:userId": "${saml:sub}" } } } ] }
「Resource」に記述するAppStream 2.0スタックのARNは、「リージョン」「AWSアカウントID」「スタック名」を適宜指定してください。
ポリシー名を「AppStream」と入力して、インラインポリシーの作成を完了します。
ステップ4: [Google Cloud Identity] ユーザープロフィール定義にカスタム属性を追加する
Google Cloud Identityの管理コンソールで、サイドメニューから「ディレクトリ」→「ユーザー」を開きます。
上部のメニューから「その他」→「カスタム属性を管理します」の順に選択します。
右上の「カスタム属性を追加」をクリックします。
以下の通り情報を入力します。
項目 | 設定値 |
---|---|
カテゴリ | SAML-USER-ATTRIBUTES |
説明 | Attributes that will be sent in the SAML request to AWS |
「カスタムフィールド」に以下の通り入力します。
名前 | 情報の種類 | 公開設定 | 値の数 |
---|---|---|---|
FederationRole | テキスト | ユーザーと管理者が閲覧可能 | 単一の値 |
SessionDuration | テキスト | ユーザーと管理者が閲覧可能 | 単一の値 |
※ 「ユーザーと管理者が閲覧可能」の「ユーザー」は自分自身のことを指しており、「全ユーザーから閲覧可能」という意味ではありません。
入力後、「追加」をクリックして設定を保存します。
ステップ5: [Google Cloud Identity] SAMLアプリケーションにSAML属性マッピングを設定する
Google Cloud Identityの管理コンソールで、サイドメニューから「アプリ」→「ウェブアプリとモバイルアプリ」を開いて、SAMLアプリケーション「SAML for AWS AppStream」を開きます。
「SAML属性のマッピングを設定」をクリックします。
「マッピングを追加」をクリックします。
以下の通り入力します。
Google Directoryの属性 | アプリの属性 |
---|---|
SAML-USER-ATTRIBUTES > FederationRole | https://aws.amazon.com/SAML/Attributes/Role |
SAML-USER-ATTRIBUTES > SessionDuration | https://aws.amazon.com/SAML/Attributes/SessionDuration |
Basic Information > Primary email | https://aws.amazon.com/SAML/Attributes/RoleSessionName |
入力後、「保存」をクリックして設定を保存します。
ステップ6: [Google Cloud Identity] 対象ユーザーにカスタム属性を設定する
Google Cloud Identityの管理コンソールで、サイドメニューから「ディレクトリ」→「ユーザー」を開きます。
対象ユーザーをクリックします。
右側の「ユーザー情報」を下にスクロールして「SAML-USER-ATTRIBUTES」の右上の鉛筆マークをクリックします。
以下の通り入力します。
名前 | 情報の種類 |
---|---|
FederationRole | フェデレーション先の「IdP定義」「ロール」を示す文字列を入力 (欄外参照) |
SessionDuration | 3600 |
「IdP定義」「ロール」を示す文字列は、以下のように2種類のARNをカンマで区切って指定します。
<AWS IAM Identity ProviderのARN>,<IAM RoleのARN>
各ARNは、AWSマネジメントコンソールの画面で確認してください。
「AWS IAM Identity Provider」のARN
入力例は以下のようになります。
arn:aws:iam::123456789012:saml-provider/GoogleCloud-IdP,arn:aws:iam::123456789012:role/AppStream_GoogleCloud-IdP
入力後、「保存」をクリックして設定を保存します。
ステップ7: [Google Cloud Identity] SAMLアプリケーションをユーザーに割り当てる
Google Cloud Identityの管理コンソールで、サイドメニューから「アプリ」→「ウェブアプリとモバイルアプリ」を開いて、SAMLアプリケーション「SAML for AWS AppStream」を開きます。
「ユーザーアクセス」をクリックします。
SAMLアプリケーションの割り当ては「全ユーザー」「組織単位」で設定が行えますが、ここでは「全ユーザー」に対して設定します。
「サービスのステータス」を「オン (すべてのユーザー)」に設定して「保存」をクリックします。
ステップ8: 対象ユーザーでGoogleにログインして、AppStream 2.0アプリケーションを利用する
これで全ての設定が終わりましたので、実際にGoogle Cloud Identityのユーザーでログインして、AppStream 2.0アプリケーションが利用できることを確認しましょう。
Webブラウザをプライベートモードやゲストモードで起動して、対象のGoogle Cloud Identityユーザーでログインします。
Googleトップページでアプリ一覧を表示すると、「SAML for AWS AppStream」というアイコンが表示されていると思います。
アイコンをクリックすると、SAML 2.0によるIDフェデレーションが行われ、AWS AppStream 2.0のカタログページへ遷移します。
アプリケーションのアイコンをクリックして、Webブラウザ内でAppStream 2.0アプリケーションが利用できることを確認します。
おわりに
SAML 2.0によるIDフェデレーションを利用する際には、IDプロバイダ (Google Cloud Identity)、SAMLアプリケーション (AWS AppStream 2.0) それぞれの画面を行ったり来たりして、複数個所で設定を行う必要があります。
設定を間違えたり飛ばしたりすると認証時に「403エラー」などが発生して接続に失敗しますので、1ステップ1ステップ確実に設定するのがポイントです。
もしエラーになった際は、前の手順に戻って設定内容を確認したり、どうしても上手く行かない時には最初からやり直したりするのが、結果的に早く解決する道だと思います。